#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：中介者模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:16 
"""

"""
中介者模式 (Mediator Pattern)
中介者模式是一种行为型设计模式，它将对象之间的通信交给一个中介者对象来处理，从而降低了对象之间的耦合度。中介者充当了对象之间的“调解者”，使得对象不直接相互通信，而是通过中介者对象来实现通信。

在 Python 中，中介者模式通常通过一个中介者对象来协调其他对象的交互。以下是一个简单的示例：

在这个示例中，Mediator 是抽象中介者类，定义了中介者对象的接口。ConcreteMediator 是具体中介者类，实现了中介者对象的具体行为。

Component 是抽象组件类，定义了组件对象的接口。ComponentA 和 ComponentB 是具体组件类，实现了组件对象的具体行为。

客户端代码创建了一个中介者对象 mediator，并将两个具体组件对象 component_a 和 component_b 添加到中介者对象中。然后通过调用组件对象的 notify_mediator 方法来通知中介者对象。

中介者模式适用于对象之间有复杂的交互关系，或者需要更好地控制对象之间的通信的情况。通过使用中介者，可以降低对象之间的耦合度，同时提高了系统的灵活性和可维护性。
"""

from abc import ABC, abstractmethod


# 抽象中介者
class Mediator(ABC):
	@abstractmethod
	def notify(self, sender, event):
		pass


# 具体中介者
class ConcreteMediator(Mediator):
	def __init__(self):
		self._components = []

	def add_component(self, component):
		self._components.append(component)

	def notify(self, sender, event):
		for component in self._components:
			if component != sender:
				component.handle(event)


# 抽象组件
class Component(ABC):
	def __init__(self, mediator):
		self._mediator = mediator

	def notify_mediator(self, event):
		self._mediator.notify(self, event)

	@abstractmethod
	def handle(self, event):
		pass


# 具体组件A
class ComponentA(Component):
	def handle(self, event):
		print(f"组件A处理事件: {event}")


# 具体组件B
class ComponentB(Component):
	def handle(self, event):
		print(f"组件B处理事件: {event}")


# 客户端代码
if __name__ == "__main__":
	mediator = ConcreteMediator()

	component_a = ComponentA(mediator)
	component_b = ComponentB(mediator)

	mediator.add_component(component_a)
	mediator.add_component(component_b)

	component_a.notify_mediator("事件1")
	component_b.notify_mediator("事件2")
